#!/usr/bin/env bash
# 
# 1.6 玩转文件描述符及重定向

# 这里，+是一个非法参数，因此将返回错误信息
ls + > out.txt

# 将stderr重定向到out.txt
ls + 2 > out.txt

# 将stderr转换成stdout，使得stderr和stdout都被重定向到同一个文件
# &1 文件描述符（File Description） ，位于/dev/fd
# 0  输入 
# 1  输出
# 2  错误

ls + 2>stderr.txt 1>stdout.txt
# 或
ls + 2>&1 output.txt
# 或
ls + &> output.txt

# 既可以将数据重定向到文件，还可以提供一份重定向数据的副本作为后续命令的stdin。
# 这一切都可以使用tee来实现。

# 终端中打印stdout，同时将它重定向到一个文件中，那么可以这样使用tee:
# command | tee FILE1 FILE2

# cat -n 显示行号（等同nl命令）
# tee -a 用于追加内容
cat a* | tee -a out.txt | cat -n

# 使用stdin作为命令参数。只需要将-作为命令的文件名参数
# cmd | cmd | cmd -
echo who is this | tee -

# >等同于1>；对于>>来说，情况也类似（即>>等同于1>>）

# 将文件重定向到命令
ls < file

# 将脚本内部的文本块进行重定向
cat<<EOF > log.txt
LOG FILE HEADER
This is a test log file
Function: System staticstics
EOF

# 自定义文件描述符
# 文件描述符是一种用于访问文件的抽象指示器（abstract indicator）。
# 存取文件离不开被称为“文件描述符”的特殊数字。
# 0、1和2分别是stdin、stdout和stderr的预留描述符编号。
# exec命令创建自己的文件描述符。

# 1） 只读模式
echo this is a test line > input.txt
exec 3<input.txt
cat <&3
# this is a test line

# 2） 截断写入模式
exec 4>output.txt
echo newline >&4
cat output.txt   # newline

# 3） 追加写入模式
exec 5>> input.txt
echo appended line >>&5
cat input.txt
# newline
# appended line

